package search_res_tab

import (
	"fmt"

	"file_explorer/common/util"
	"file_explorer/model"
	"file_explorer/service/task"
	"file_explorer/view/packed_widgets"
	"file_explorer/view/store"

	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/theme"
)

type StatusBar struct {
	*container.Scroll

	Label      *packed_widgets.Label
	WalkToggle *packed_widgets.Toggle

	walker *task.PathWalker

	tabCtx *store.SearchResTabContext
}

func (bar *StatusBar) queryStatus() {
	bar.walker = task.NewPathWalker(bar.tabCtx.CheckedList)

	var regularCount, dirCount, size int64
	bar.walker.SetOnAccess(func(root string, info *model.FileInfo) {
		// 累计文件目录数、占用空间
		if info.IsDir() {
			dirCount++
		} else {
			regularCount++
			size += info.Size
		}
	})
	bar.walker.SetOnRefresh(500, func(root string, info *model.FileInfo) {
		// 刷新标签栏，显示当前访问路径
		bar.Label.SetText(info.GetPath()[len(root):])
		bar.Refresh()
	})
	bar.walker.SetOnFinish(func(costTime int64, ok bool, err error) {
		// 隐藏遍历按钮
		bar.WalkToggle.Hide()

		// 异常结束，显示错误信息
		if err != nil {
			bar.Label.SetText(err.Error())
			bar.Refresh()
			return
		}
		// 手动结束，还原状态
		if !ok {
			bar.RefreshData()
			return
		}
		// 更新label
		bar.Label.SetText(fmt.Sprintf("选中%d项, 子文件%d项, 子目录%d项, 占用%s，扫描耗时%dms",
			len(bar.tabCtx.CheckedList), regularCount, dirCount, util.ConvSize(size), costTime))
		// 清除遍历任务
		bar.walker = nil
	})

	// 开始遍历
	bar.tabCtx.GetGlobalContext().TaskManager.SubmitTabTask(bar.tabCtx.GetTabItem(), bar.walker)
}

func (bar *StatusBar) RefreshData() {
	// 隐藏遍历按钮
	bar.WalkToggle.Hide()
	// 如果存在遍历任务，停止
	if bar.walker != nil {
		bar.tabCtx.GetGlobalContext().TaskManager.DeleteTabTask(bar.tabCtx.GetTabItem(), bar.walker)
		bar.walker = nil
	}

	// 显示选中项目
	text := fmt.Sprintf("%d项", len(bar.tabCtx.FileInfos))
	if len(bar.tabCtx.CheckedList) == 0 {
		bar.Label.SetText(text)
		bar.Refresh()
		return
	}

	text += fmt.Sprintf(", %d项被选中", len(bar.tabCtx.CheckedList))

	// 获取项目是否全为文件
	allRegular := true
	totalSize := int64(0)
	for _, fileInfo := range bar.tabCtx.CheckedList {
		if fileInfo.IsDir() {
			allRegular = false
			break
		}
		totalSize += fileInfo.Size
	}

	if allRegular {
		// 选中项全为文件时显示占用
		text += fmt.Sprintf(", 占用%s", util.ConvSize(totalSize))
		bar.Label.SetText(text)
		bar.WalkToggle.Hide()
		bar.Refresh()
		return
	}

	// 选中项存在目录，显示遍历按钮
	bar.Label.SetText(text)
	bar.WalkToggle.Show()
	bar.Refresh()
}

func NewStatusBar(tabCtx *store.SearchResTabContext) *StatusBar {
	bar := &StatusBar{
		Label:      packed_widgets.NewLabel(""),
		WalkToggle: packed_widgets.NewToggle("计算空间", "停止扫描", theme.LoginIcon(), theme.CancelIcon()),
		tabCtx:     tabCtx,
	}

	// 初始状态下隐藏遍历开关
	bar.WalkToggle.Hide()
	bar.WalkToggle.OnSwitch = func(b bool) {
		if !b {
			bar.queryStatus()
		} else if bar.walker != nil {
			bar.RefreshData()
		}
	}

	bar.Scroll = container.NewHScroll(container.NewHBox(bar.WalkToggle.Button, bar.Label))

	return bar
}
